home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
lisp
/
kcl
/
akcl
/
akcl1615.lha
/
lsp
/
gprof.lsp
< prev
next >
Wrap
Lisp/Scheme
|
1990-08-13
|
4KB
|
133 lines
(in-package 'si)
;; (load "gprof.o")
;; You must have a kcl image with profiling information and monstartup
;; typically saved_kcp. NOTE: if monstartup calls sbrk (true in
;; most 4.3bsd's except sun >= OS 4.0) you must be very careful to
;; allocate all the space you will use prior to calling monstartup.
;; If subsequent storage allocation causes the hole to move you will
;; most certainly lose. See below for instructions
;; on how to construct saved_kcp.
;; If you want function invocation counts to be kept do
;; (setq compiler::*cc* (concatentate 'string compiler::*cc* " -pg "))
;; before compiling the relevant files. (This is done when you load
;; lsp/gprof.o)
;; In the image saved_kcp Load in your files. Load in gprof.o: (load
;; "lsp/gprof.o") Invoke monstartup once to setup buffers: (monstartup
;; lowpc highpc) eg. (monstartup #x800 3000000) [highpc should be a bit
;; bigger than the highest address you have seen when loading your files]
;; Use moncontrol to toggle profiling on and off: (moncontrol 0) to turn
;; profiling off, and (moncontrol 1) to turn it on. Use
;; (wrtie-gmons+syms) to terminate with writing a gmon.out and syms.out
;; in the current directory. I know of no way of clearing the buffers,
;; since secret routines set up the buffers, and we don't know where they
;; are or how large. Thus all information is cumulative.
;; % gprof syms.out
;; will display the output (add -b) to make it briefer.
;; A sample session on rascal:
#|
/usr2/skcl/unixport/saved_kcp
AKCL (Austin Kyoto Common Lisp) Version(1.147) Sun May 14 15:26:07 CDT 1989
Contains Enhancements by W. Schelter
>(load "/tmp/fo")
Loading /tmp/fo.o
start address -T 1d04e0 Finished loading /tmp/fo.o
528
>(load "/usr2/skcl/lsp/gprof")
Loading gprof.o
Adding -pg to the *cc* commandstart address -T 1d0800
Finished loading gprof.o
2112
;; NOTE: If the following calls sbrk [eg 4.3bsd or sun OS3 ] but not Sun OS4,
;; then you MUST make sure to allocate sufficient memory before doing
;; monstartup, so that the hole will not have to be moved.
>(si::monstartup #x800 2000000)
2584576
>(si::goo)(si::goo) ;;defined in /tmp/foo.lisp
NIL
>NIL
>(si::write-gmon+syms)
writing syms..
0
[NOTE: The safest way to exit the lisp is to stop it with Ctrl-Z
and then kill it. We do NOT want to run the exit code which
normally writes out a monitoring file].
rascal% gprof -b syms.out
...
called/total parents
index %time self descendents called+self name index
called/total children
0.00 0.00 1/200 _call_or_link [8]
0.02 0.02 199/200 GOO [2]
[1] 49.6 0.02 0.02 200 FOO [1]
0.02 0.00 200/203 _make_cons [4]
... Interpretation: Foo is called 199 times by (parent) goo and once
by (parent) call_or_link (the setting up of the fast link). Foo
itself calls (child) make_cons 200 of the 203 times that make_cons is
called... Lower down we would see that goo is called twice.
-- /tmp/fo.lisp --
(defun foo () (cons nil nil))
(defun goo () (sloop::sloop for i below 100 do (foo)))
-- end of file --
|#
;; Creating saved_kcp
;; On a sun in sun0S 3 or 4.0
;; make gcrt0.o-V
;; mkdir akcl/go
;; (cd akcl/go ; ln -s ../o/makefile ../o/*.o .)
;; remove a few .o files and do
;; (cd go ; make "CFLAGS = -I../h -pg -g -c")
;; then (cd unixport ; make kcp)
(clines
#-aix3 "#include \"gprof.hc\""
#+aix3 "#include \"aix_gprof.hc\""
)
(eval-when (load)
(progn (setq compiler::*cc* (CONCATENATE 'string compiler::*cc* " -pg "))
(format t "~% Adding -pg to the *cc* command"))
)
(defun write-gmon+syms()
(monitor2 0 0 0 0)
(princ "writing syms..")
(set-up-combined)
(write_outsyms)
)
(defentry monstartup (int int) (int "mymonstartup"))
(defentry monitor2 (int int int int) (int "mymonitor"))
(defentry moncontrol (int) (int "moncontrol"))
(defentry write_outsyms () (int "write_outsyms"))